﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Text.RegularExpressions;
using HCommon;
using System.Globalization;
using excel = Microsoft.Office.Interop.Excel;

namespace eStock.hControl
{
    public partial class hDataGridView : DataGridView
    {
        private excel.Application eApp;
        private excel.Workbooks eBooks;
        private excel.Workbook eBook;
        private excel.Worksheet eSheet;

        public bool isCopy = false;
        public int curRow = -1;
        public bool SaveGridErr = false;

        public hDataGridView()
        {
            InitializeComponent();
        }

        public hDataGridView(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
        }

        //protected int hRowInit;
        //[Category("1-HCOM"), DefaultValue(0), Description("Số dòng khởi tạo trên sheet")]
        //public int RowInit
        //{
        //    get { return hRowInit; }
        //    set
        //    {
        //        hRowInit = value;
        //        if (hRowInit > 0)
        //        {
        //            this.Rows.Add(hRowInit);
        //            this.tsmAddRow.Visible = true;
        //        }
        //        else
        //        {
        //            this.tsmAddRow.Visible = false;
        //        }
        //    }
        //}

        protected DataGridView hSumGrid;
        [Category("1-HCOM"), DefaultValue(false), Description("Sumary gridview")]
        public DataGridView SumGrid
        {
            get { return hSumGrid; }
            set
            {
                hSumGrid = value;
            }
        }

        protected string[] hSumColumns;
        [Category("1-HCOM"), DefaultValue(false), Description("Sumary columns")]
        public string[] SumColumns
        {
            get { return hSumColumns; }
            set
            {
                hSumColumns = value;
            }
        }

        public event EventHandler hDelete;

        public virtual void hDelete_Click(EventArgs e)
        {
            if (hDelete != null)
            {
                hDelete(this, e);
            }
        }

        private void tsmDelete_Click(object sender, EventArgs e)
        {
            DialogResult ds = MessageBox.Show(this, "Bạn có chắc chắn muốn xóa những bản ghi đã chọn?", "Thông báo", MessageBoxButtons.YesNo);
            if (ds == System.Windows.Forms.DialogResult.No)
            {
                return;
            }
            hDelete_Click(e);
        }

        private void hDataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            try
            {
                // Tô màu và đánh số thứ tự cho cột row header
                foreach (DataGridViewRow row in this.Rows)
                {
                    if (row.DataBoundItem != null)
                    {
                        row.HeaderCell.Value = String.Format("{0}", row.Index + 1);
                    }
                    if (row.Index % 2 != 0)
                    {
                        row.DefaultCellStyle.BackColor = Color.WhiteSmoke;
                    }
                }
            }
            catch { }

            // Gán dòng đầu tiên là dòng đang xử lý
            try
            {
                if (curRow >= 0)
                {
                    this.FirstDisplayedScrollingRowIndex = curRow;
                    this.CurrentCell = this.Rows[curRow].Cells[0];
                    this.Rows[curRow].Selected = true;
                }
            }
            catch { }
        }

        private void hDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            #region "TextBox"
            try
            {
                // Nếu cột này là cột Textbox
                if (this.Columns[e.ColumnIndex].GetType().Name == "hDataGridViewTextBoxColumn")
                {
                    string FBCode = ((hDataGridViewTextBoxColumn)this.Columns[e.ColumnIndex]).FBCode.Trim();
                    bool ShowName = ((hDataGridViewTextBoxColumn)this.Columns[e.ColumnIndex]).ShowName;
                    if (FBCode.Length > 0)
                    {
                        // Nếu ô này để trắng thì có leave cũng return luôn
                        if (this.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue.ToString().Trim().Length == 0)
                        {
                            return;
                        }

                        // Nếu chỉ có 1 dòng dữ liệu thì fill luôn vào cell đó
                        DataTable dt = new DataTable();
                        dt = Dao.Get_Table("Exec spLoadFB '" + Common.xoaNhay(FBCode) + "',N'" + Common.xoaNhay(this.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue.ToString()) + "'");
                        if (dt.Rows.Count == 1)
                        {
                            if (ShowName)
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = dt.Rows[0]["MinorName"].ToString();
                            }
                            else
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = dt.Rows[0]["MinorCd"].ToString();
                            }
                            return;
                        }

                        // Nếu không thì tìm trong FB rồi fill dữ liệu vào cell đó
                        hFindBox findBox = new hFindBox(dt, FBCode, this.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue.ToString());
                        findBox.ShowDialog();
                        try
                        {
                            if (findBox.gRow == null)
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                                return;
                            }
                            if (ShowName)
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = findBox.gRow.Cells["MinorName"].Value.ToString();
                            }
                            else
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = findBox.gRow.Cells["MinorCd"].Value.ToString();
                            }
                            return;
                        }
                        catch { }
                    }
                }
            }
            catch { }
            #endregion

            #region "DateBox"
            try
            {
                // Nếu cột này là cột Datebox
                if (this.Columns[e.ColumnIndex].GetType().Name == "hDataGridViewDateBoxColumn")
                {
                    if (this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
                    {
                        string cellVal = this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString().Trim().Replace("/", "");
                        int outNum = 0;

                        if (int.TryParse(cellVal, out outNum) == false)
                        {
                            this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                            Dialog.ShowMess(Dialog.mType.warn, "Ô ngày tháng năm chỉ được nhập số");
                            return;
                        }
                        if (outNum == 0)
                        {
                            this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                            return;
                        }

                        if (cellVal.Length == 0)
                        {
                            this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                        }
                        else if (cellVal.Length == 1)
                        {
                            this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = DateTime.Now.ToString("0" + cellVal + "/MM/yyyy");
                        }
                        else if (cellVal.Length == 2)
                        {
                            try
                            {
                                DateTime dt = DateTime.ParseExact(DateTime.Now.ToString("yyyyMM" + cellVal), "yyyyMMdd", CultureInfo.InvariantCulture);
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = dt.ToString("dd/MM/yyyy");
                            }
                            catch
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                                Dialog.ShowMess(Dialog.mType.warn, "Ô ngày tháng năm nhập sai định dạng");
                            }
                        }
                        else if (cellVal.Length == 3 || cellVal.Length == 5 || cellVal.Length == 7 || cellVal.Length > 8)
                        {
                            this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                            Dialog.ShowMess(Dialog.mType.warn, "Ô ngày tháng năm nhập sai định dạng");
                        }
                        else if (cellVal.Length == 4)
                        {
                            string dd = cellVal.Substring(0, 2);
                            string MM = cellVal.Substring(2, 2);
                            try
                            {
                                DateTime dt = DateTime.ParseExact(DateTime.Now.ToString("yyyy" + MM + dd), "yyyyMMdd", CultureInfo.InvariantCulture);
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = dt.ToString("dd/MM/yyyy");
                            }
                            catch
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                                Dialog.ShowMess(Dialog.mType.warn, "Ô ngày tháng năm nhập sai định dạng");
                            }
                        }
                        else if (cellVal.Length == 6)
                        {
                            try
                            {
                                string dd = cellVal.Substring(0, 2);
                                string MM = cellVal.Substring(2, 2);
                                string yy = cellVal.Substring(4, 2);
                                DateTime dt = DateTime.ParseExact(DateTime.Now.ToString("20" + yy + MM + dd), "yyyyMMdd", CultureInfo.InvariantCulture);
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = dt.ToString("dd/MM/yyyy");
                            }
                            catch
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                                Dialog.ShowMess(Dialog.mType.warn, "Ô ngày tháng năm nhập sai định dạng");
                            }
                        }
                        else if (cellVal.Length == 8)
                        {
                            try
                            {
                                string dd = cellVal.Substring(0, 2);
                                string MM = cellVal.Substring(2, 2);
                                string yyyy = cellVal.Substring(4, 4);
                                DateTime dt = DateTime.ParseExact(DateTime.Now.ToString(yyyy + MM + dd), "yyyyMMdd", CultureInfo.InvariantCulture);
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = dt.ToString("dd/MM/yyyy");
                            }
                            catch
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                                Dialog.ShowMess(Dialog.mType.warn, "Ô ngày tháng năm nhập sai định dạng");
                            }
                        }
                    }
                }
            }
            catch { }
            #endregion
        }

        private void hDataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                // Nếu ko có dòng dữ liệu nào hoặc bấm vào header thì return luôn
                if (e.RowIndex < 0)
                {
                    return;
                }

                // Gán Current Row
                curRow = e.RowIndex;

                // Nếu đây là cột FB thì hiện dialog
                if (this.Columns[e.ColumnIndex].GetType().Name == "hDataGridViewTextBoxColumn")
                {
                    string FBCode = ((hDataGridViewTextBoxColumn)this.Columns[e.ColumnIndex]).FBCode.Trim();
                    bool ShowName = ((hDataGridViewTextBoxColumn)this.Columns[e.ColumnIndex]).ShowName;
                    if (FBCode.Length > 0)
                    {
                        DataTable dt = new DataTable();
                        dt = Dao.Get_Table("Exec spLoadFB '" + Common.xoaNhay(FBCode) + "',N'" + Common.xoaNhay(this.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue.ToString()) + "'");

                        hFindBox findBox = new hFindBox(dt, FBCode, this.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue.ToString());
                        findBox.ShowDialog();

                        // Gán giá trị cho cell đó với giá trị tìm được trong FB
                        try
                        {
                            if (findBox.gRow == null)
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = string.Empty;
                                return;
                            }
                            if (ShowName)
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = findBox.gRow.Cells["MinorName"].Value.ToString();
                            }
                            else
                            {
                                this.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = findBox.gRow.Cells["MinorCd"].Value.ToString();
                            }
                            return;
                        }
                        catch { }
                    }
                }
            }
            catch { }
        }

        private void hDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode == Keys.V && e.Control == true)
                {
                    string strData = Clipboard.GetText().Replace("\n", "");
                    string[] splData = strData.Split('\r');
                    int curRow = this.CurrentCell.RowIndex;
                    int curCol = this.CurrentCell.ColumnIndex;

                    for (int i = 0; i < splData.Length; i++)
                    {
                        if (splData[i].Trim().Length == 0)
                        {
                            continue;
                        }
                        isCopy = true;
                        this.Rows[curRow + i].Cells[curCol].Value = splData[i].Trim();
                    }
                }
            }
            catch { }
        }

        //private void tsmAddRow_Click(object sender, EventArgs e)
        //{
        //    try
        //    {
        //        if (hRowInit == 0)
        //        {
        //            return;
        //        }
        //        this.Rows.Add(hRowInit);
        //    }
        //    catch { }
        //}

        public void tsmExcelExport_Click(object sender, EventArgs e)
        {
            frmWait objWait = new frmWait();
            try
            {
                objWait.Show();
                Application.DoEvents();

                eApp = new excel.Application();
                eApp.Visible = false;
                eBooks = eApp.Workbooks;
                eBook = eBooks.Add(1);
                eSheet = (excel.Worksheet)eBook.Sheets[1];

                //eApp.DisplayAlerts = false;

                DataTable dt = (this.DataSource as DataTable);
                int colIdx = 0;
                foreach (DataColumn col in dt.Columns)
                {
                    colIdx++;
                    eSheet.Cells[1, colIdx] = this.Columns[col.ColumnName].HeaderText;
                    int rowIdx = 1;
                    foreach (DataRow row in dt.Rows)
                    {
                        rowIdx++;
                        eSheet.Cells[rowIdx, colIdx] = row[col.ColumnName].ToString();
                    }
                }
                eSheet.UsedRange.NumberFormat = "@";
                eSheet.get_Range(eSheet.Cells[1, 1], eSheet.Cells[1, dt.Columns.Count]).Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.PowderBlue);

                eSheet.get_Range(eSheet.Cells[1, 1], eSheet.Cells[dt.Rows.Count + 1, dt.Columns.Count]).Borders.LineStyle = excel.XlLineStyle.xlContinuous;
                eSheet.get_Range(eSheet.Cells[1, 1], eSheet.Cells[dt.Rows.Count + 1, dt.Columns.Count]).Borders.Weight = 2d;
                eSheet.UsedRange.Columns.AutoFit();
                eApp.Visible = true;
            }
            catch (Exception ex) { Common.GhiLog("tsmExcelExport_Click", ex); }
            finally
            {
                GC.Collect();
                objWait.Close();
            }
        }

        private void hDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            try
            {
                if (e.Exception.Message.Contains("Input string was not in a correct format."))
                {
                    Dialog.ShowMess(Dialog.mType.err, "Lỗi khi nhập dữ liệu, vui lòng nhập lại.");
                }
            }
            catch { }
        }

        private void hDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            SummaryCalc();
        }

        public void SummaryCalc()
        {
            try
            {
                if (this.hSumGrid == null)
                {
                    return;
                }

                if (this.hSumColumns == null || this.hSumColumns.Length == 0)
                {
                    return;
                }

                if (hSumGrid != null && hSumGrid.Rows.Count == 0)
                {
                    hSumGrid.Rows.Add(1);
                }
                hSumGrid.AllowUserToResizeColumns = false;
                hSumGrid.Rows[0].HeaderCell.Value = "Tổng";
                foreach (string colName in hSumColumns)
                {
                    Double sumAmt = 0;
                    foreach (DataGridViewRow row in this.Rows)
                    {
                        try
                        {
                            Double outAmt = 0;
                            bool rs = Double.TryParse(row.Cells[colName].Value.ToString(), out outAmt);
                            if (rs == true)
                            {
                                sumAmt += outAmt;
                            }
                        }
                        catch { }
                    }
                    hSumGrid.Rows[0].Cells[this.Columns[colName].Index].Value = sumAmt;
                }
            }
            catch { }
        }

        private void hDataGridView_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
        {
            try
            {
                if (this.hSumGrid == null)
                {
                    return;
                }
                hSumGrid.Columns[e.Column.Index].Width = e.Column.Width;
            }
            catch { }
        }

        private void tsmCheckErr_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.CurrentRow.Cells["ErrMsg"].Value == null || this.CurrentRow.Cells["ErrMsg"].Value.ToString().Trim().Length == 0) 
                {
                    return;
                }
                Dialog.ShowMess(Dialog.mType.err, this.CurrentRow.Cells["ErrMsg"].Value.ToString());
            }
            catch { }
        }

    }
}
